#!/bin/bash

###
# @Author: Yvan && yvan.lu@ityww.com
# @Date: 2025-03-24 09:27:00
# @Web: https://www.ityww.com
# @Description:
# - 这个脚本的目的是针对Linux首次安装系统后的初始化操作：
#   - 配置切换国内阿里云YUM仓库源（openEuler系统为华为云源）:
#     - 检测官方源，如官方源存在，则替换为国内源，如不存在则提示并跳过配置。
#     - 配置EPEL源，如果EPEL源不存在，则配置为国内源，如存在则提示并跳过配置。
#   - 安装常用基础软件包
#   - 服务配置：
#     - 关闭SELinux服务（针对Radhat系列）
#     - 关闭系统防火墙服务
#     - 优化SSH服务：禁用基于GSSAPI的用户认证模式、禁用使用DNS反解析。
#   - 系统更新:
#     - Debian系列直接为全局更新（含系统修订版本）
#     - Radhat系列用户选择更新选项：0为全局更新（含系统次版本）、1为仅更新本地软件及Kernel、q为退出升级
# - 支持：CentOS 6.x/7.x/8.x RockyLinux 8.x/9.x AlmaLinux 8.x/9.x Ubuntu Server 20/22/24 openEuler 22.x/24.x
###

set -eo pipefail

# 定义颜色代码
# 定义红色ANSI转义序列，用于在终端中输出红色文本
RED='\033[0;31m'
# 定义绿色ANSI转义序列，用于在终端中输出绿色文本
GREEN='\033[0;32m'
# 定义黄色ANSI转义序列，用于在终端中输出黄色文本
YELLOW='\033[0;33m'
# 定义无颜色ANSI转义序列，用于重置文本颜色
NC='\033[0m'

# 日志记录函数，用于在终端中以不同颜色显示不同类型的日志信息
log() {
    # 获取日志类型和消息内容作为局部变量
    local log_type=$1
    local message=$2
    # 获取当前时间并格式化为年-月-日 时:分:秒
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")

    # 根据日志类型，使用不同的颜色和标签输出日志信息
    case ${log_type} in
    "info")
        # 信息型日志，使用绿色显示
        echo -e "${GREEN}[INFO]${NC} ${timestamp} - ${message}"
        ;;
    "warn")
        # 警告型日志，使用黄色显示
        echo -e "${YELLOW}[WARN]${NC} ${timestamp} - ${message}"
        ;;
    "error")
        # 错误型日志，使用红色显示
        echo -e "${RED}[ERROR]${NC} ${timestamp} - ${message}"
        ;;
    esac
}

# 检查脚本是否以root权限运行
# 如果当前用户的UID不等于0（即不是root用户）
if [ "$(id -u)" != "0" ]; then
    # 记录错误日志
    log error "此脚本必须以root权限运行"
    # 并退出脚本，返回状态码1
    return 1
fi

# 检测网络函数
check_network() {
    # 记录网络解析开始的日志
    log info "网络解析中"

    # 定义ping的目标地址
    local ping_target="8.8.8.8"

    # 检查网络解析是否正常
    if ping -c 2 -W 1 "${ping_target}" >/dev/null; then
        # 网络解析正常，等待一段时间后继续
        sleep 3
        # 记录网络解析正常的日志
        log info "网络解析正常"
    else
        # 网络解析异常，记录错误日志并退出脚本
        log error "网络解析异常请检查网络"
        return 1
    fi
}

# 检测操作系统并验证其是否被支持
check_os() {
    # 检查是否存在/etc/os-release文件以获取系统信息
    if [ -f /etc/os-release ]; then
        # 加载/etc/os-release文件中的变量
        source /etc/os-release
        # 提取操作系统ID作为os_name变量的值
        os_name="${ID}"
        # 从VERSION_ID中提取主要版本号
        major_version=$(echo "${VERSION_ID}" | cut -d. -f1)
        # 记录操作系统信息
        log info "检测到操作系统：${PRETTY_NAME}"
    # 增加对CentOS 6的检测（没有/etc/os-release文件）
    elif [ -f /etc/centos-release ]; then
        # 从/etc/centos-release提取版本信息
        local centos_release=$(cat /etc/centos-release)
        # 识别CentOS 6特有的版本字符串
        if [[ "$centos_release" == *"release 6"* ]]; then
            os_name="centos"
            major_version="6"
            log info "检测到操作系统：${centos_release}"
        else
            log error "无法识别的CentOS版本：${centos_release}"
            return 1
        fi
    else
        # 如果无法获取系统信息，则记录错误并退出脚本
        log error "无法获取系统信息"
        return 1
    fi

    # # 根据操作系统ID判断是否为支持的操作系统
    # case "${os_name}" in
    # "centos" | "rocky" | "almalinux" | "ubuntu" | "openEuler")
    #     # 如果是支持的操作系统，则不执行任何操作
    #     ;;
    # *)
    #     # 如果不是支持的操作系统，则记录错误并退出脚本
    #     log error "不支持的操作系统！"
    #     return 1
    #     ;;
    # esac
}

# 清理软件包缓存并生成新的缓存
clean_and_makecache() {
    # 检查 dnf 是否可用
    if command -v dnf &>/dev/null; then
        # 使用 dnf 清理所有缓存并生成新的缓存，输出重定向到 /dev/null
        dnf clean all >/dev/null
        dnf makecache >/dev/null
    elif command -v yum &>/dev/null; then
        # 如果 dnf 不可用，使用 yum 清理所有缓存并生成新的缓存，输出重定向到 /dev/null
        yum clean all >/dev/null
        yum makecache &>/dev/null
    else
        # 如果 dnf 和 yum 都不可用，尝试使用 apt-get 更新软件包列表，输出重定向到 /dev/null
        sudo apt-get update -y >/dev/null
    fi
}

# 更新镜像源
update_mirrors() {
    log info "开始更新镜像源"
    case "${os_name}" in
    "centos")
        case "${major_version}" in
        "6")
            # 检测CentOS 6官方源
            local repo_files="/etc/yum.repos.d/CentOS-Base.repo"
            if grep -q -E '^mirrorlist=http://mirrorlist.centos.org' "${repo_files}"; then
                log info "检测到 CentOS ${major_version} 官方源，开始替换为阿里云源..."
                cp "${repo_files}"{,.backup} || {
                    log error "备份CentOS-Base.repo文件失败，请检查权限。"
                    return 1
                }
                curl -fsSL -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo || {
                    log error "下载CentOS-Base.repo文件失败，请检查网络。"
                    return 1
                }
                log info "替换 CentOS 源完成"
            else
                log warn "CentOS ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测CentOS 6 EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                curl -fsSL -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-6.repo || {
                    log error "下载epel.repo文件失败，请检查网络。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        "7")
            # 检测CentOS 7官方源
            local repo_files="/etc/yum.repos.d/CentOS-Base.repo"
            if grep -q -E '^mirrorlist=http://mirrorlist.centos.org' "${repo_files}"; then
                log info "检测到 CentOS ${major_version} 官方源，开始替换为阿里云源..."
                cp "${repo_files}"{,.backup} || {
                    log error "备份CentOS-Base.repo文件失败，请检查权限。"
                    return 1
                }
                curl -fsSL -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo || {
                    log error "下载CentOS-Base.repo文件失败，请检查网络。"
                    return 1
                }
                log info "替换 CentOS 源完成"
            else
                log warn "CentOS ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测CentOS 7 EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                curl -fsSL -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo || {
                    log error "下载epel.repo文件失败，请检查网络。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        "8")
            for file in /etc/yum.repos.d/CentOS-Linux-*.repo; do
                mv "${file}"{,.backup}
            done
            curl -fsSL -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo || {
                log error "下载CentOS-Base.repo文件失败，请检查网络。"
                return 1
            }
            yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm >/dev/null || {
                log error "安装epel.repo文件失败，请检查网络。"
                return 1
            }
            sed -i \
                -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' \
                -e 's|^metalink|#metalink|' /etc/yum.repos.d/epel* || {
                log error "更新epel.repo文件失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "rocky")
        case "${major_version}" in
        "8")
            # 检测Rocky Linux 官方源
            local repo_files="/etc/yum.repos.d/Rocky-AppStream.repo"
            if grep -q -E '^mirrorlist=https://mirrors\.rockylinux\.org' "${repo_files}"; then
                log info "检测到 Rocky Linux ${major_version} 官方源，开始替换为阿里云源..."
                sed -e 's|^mirrorlist=|#mirrorlist=|g' \
                    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
                    -i.bak /etc/yum.repos.d/Rocky-*.repo || {
                    log error "更新 Rocky Linux 源失败，请检查配置。"
                    return 1
                }
                log info "替换 Rocky Linux 源完成"
            else
                log warn "Rocky Linux ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测Rocky Linux EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm >/dev/null || {
                    log error "安装EPEL源失败，请检查网络。"
                    return 1
                }
                sed -i \
                    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' \
                    -e 's|^metalink|#metalink|' /etc/yum.repos.d/epel* || {
                    log error "更新 EPEL 文件失败，请检查配置。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        "9")
            # 检测Rocky Linux 官方源
            local repo_files="/etc/yum.repos.d/rocky.repo"
            if grep -q -E '^mirrorlist=https://mirrors.rockylinux.org' "${repo_files}"; then
                log info "检测到 Rocky Linux ${major_version} 官方源，开始替换为阿里云源..."
                sed -e 's|^mirrorlist=|#mirrorlist=|g' \
                    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
                    -i.bak /etc/yum.repos.d/rocky*.repo || {
                    log error "更新 Rocky Linux 源失败，请检查配置。"
                    return 1
                }
                log info "替换 Rocky Linux 源完成"
            else
                log warn "Rocky Linux ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测Rocky Linux EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm >/dev/null || {
                    log error "安装epel.repo文件失败，请检查网络。"
                    return 1
                }
                sed -i \
                    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' \
                    -e 's|^metalink|#metalink|' /etc/yum.repos.d/epel* || {
                    log error "更新epel.repo文件失败，请检查配置。"
                    return 1
                }
                dnf config-manager --set-disabled epel-cisco-openh264 || {
                    log error "禁用epel-cisco-openh264软件源失败，请检查配置。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "almalinux")
        case "${major_version}" in
        "8")
            local repo_files="/etc/yum.repos.d/almalinux.repo"
            if grep -q -E '^mirrorlist=https://mirrors.almalinux.org' "${repo_files}"; then
                log info "检测到 AlmaLinux ${major_version} 官方源，开始替换为阿里云源..."
                sed -e 's|^mirrorlist=|#mirrorlist=|g' \
                    -e 's|^# baseurl=https://repo.almalinux.org|baseurl=https://mirrors.aliyun.com|g' \
                    -i.bak /etc/yum.repos.d/almalinux*.repo || {
                    log error "替换AlmaLinux源失败，请检查配置。"
                    return 1
                }
                log info "替换 AlmaLinux 源完成"
            else
                log warn "AlmaLinux ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测Rocky Linux EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm >/dev/null || {
                    log error "安装epel.repo文件失败，请检查网络。"
                    return 1
                }
                sed -i \
                    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' \
                    -e 's|^metalink|#metalink|' /etc/yum.repos.d/epel* || {
                    log error "更新epel.repo文件失败，请检查配置。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        "9")
            local repo_files="/etc/yum.repos.d/almalinux-appstream.repo"
            if grep -q -E '^mirrorlist=https://mirrors.almalinux.org' "${repo_files}"; then
                log info "检测到 AlmaLinux ${major_version} 官方源，开始替换为阿里云源..."
                sed -e 's|^mirrorlist=|#mirrorlist=|g' \
                    -e 's|^# baseurl=https://repo.almalinux.org|baseurl=https://mirrors.aliyun.com|g' \
                    -i.bak /etc/yum.repos.d/almalinux*.repo || {
                    log error "替换AlmaLinux源失败，请检查配置。"
                    return 1
                }
                log info "替换 AlmaLinux 源完成"
            else
                log warn "AlmaLinux ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            # 检测Rocky Linux EPEL源
            if [ ! -f /etc/yum.repos.d/epel.repo ]; then
                log info "配置 EPEL 源替换为阿里云源..."
                dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm >/dev/null || {
                    log error "安装epel.repo文件失败，请检查网络。"
                    return 1
                }
                sed -i \
                    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' \
                    -e 's|^metalink|#metalink|' /etc/yum.repos.d/epel* || {
                    log error "更新epel.repo文件失败，请检查配置。"
                    return 1
                }
                dnf config-manager --set-disabled epel-cisco-openh264 || {
                    log error "禁用epel-cisco-openh264软件源失败，请检查配置。"
                    return 1
                }
                log info "配置 EPEL 源完成"
            else
                log warn "EPEL 源已存在，跳过配置！"
            fi
            ;;
        *)
            log error "不支持的AlmaLinux版本：${major_version}"
            return 1
            ;;
        esac
        ;;
    "ubuntu")
        # Ubuntu更新APT源
        case ${major_version} in
        "20" | "22")
            # 检测 Ubuntu 官方源
            local repo_files="/etc/apt/sources.list"
            if grep -q -E "^deb http://archive.ubuntu.com" ${repo_files}; then
                log info "检测到 Ubuntu ${major_version} 官方源，开始替换为阿里云源..."
                sed 's|^deb http://archive.ubuntu.com|deb https://mirrors.aliyun.com|g' \
                    -i.bak ${repo_files} || {
                    log error "替换Ubuntu源失败，请检查配置。"
                    return 1
                }
                log info "替换 Ubuntu 源完成"
            else
                log warn "Ubuntu ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            ;;
        "24")
            # 检测 Ubuntu 官方源
            local repo_files="/etc/apt/sources.list.d/ubuntu.sources"
            if grep -q -E "http://archive.ubuntu.com" ${repo_files} || grep -q -E "http://security.ubuntu.com" ${repo_files}; then
                log info "检测到 Ubuntu ${major_version} 官方源，开始替换为阿里云源..."
                sudo sed -e 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' \
                    -e 's|http://security.ubuntu.com|https://mirrors.aliyun.com|g' \
                    -i.bak ${repo_files} || {
                    log error "替换Ubuntu源失败，请检查配置。"
                    return 1
                }
                log info "替换 Ubuntu 源完成"
            else
                log warn "Ubuntu ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            ;;
        *)
            log error "不支持的Ubuntu版本：${major_version}"
            return 1
            ;;
        esac
        ;;
    "openEuler")
        case "${major_version}" in
        "22" | "24")
            # 检测openEuler 官方源
            local repo_files="/etc/yum.repos.d/openEuler.repo"
            if grep -q -E '^baseurl=http://repo.openeuler.org' "${repo_files}"; then
                log info "检测到 openEuler ${major_version} 官方源，开始替换为华为云源..."
                sed -e 's|baseurl=http://repo.openeuler.org|baseurl=https://mirrors.huaweicloud.com/openeuler|g' \
                    -e 's|metalink=https://mirrors.openeuler.org|metalink=https://mirrors.huaweicloud.com/openeuler|g' \
                    -e 's|gpgkey=http://repo.openeuler.org|gpgkey=https://mirrors.huaweicloud.com/openeuler|g' \
                    -i.bak "${repo_files}" || {
                    log error "更新openEuler源失败，请检查配置。"
                    return 1
                }
                log info "替换 openEuler 源完成"
            else
                log warn "openEuler ${major_version} 源已非官方源，可能已被配置，请自行确认，跳过配置！"
            fi
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    *)
        log error "不支持的操作系统"
        return 1
        ;;
    esac
    log info "开始清理本地缓存和重新生成缓存"
    clean_and_makecache || {
        log error "重新生成缓存失败，请检查配置。"
        return 1
    }
    log info "缓存清理更新完成"
    log info "镜像源更新完成"
}

# 安装常用包
install_common_packages() {
    local common_packages_centos6=("bash-completion" "yum-utils" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "bind-utils" "telnet" "lsof" "iperf3" "htop")
    local common_packages_centos7=("bash-completion" "bash-completion-extras" "yum-utils" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "bind-utils" "telnet" "lsof" "iperf3" "htop")
    local common_packages_centos8=("bash-completion" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "bind-utils" "telnet")
    local common_packages_rockylinux=("bash-completion" "yum-utils" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "bind-utils" "telnet" "lsof" "iperf3" "htop")
    local common_packages_almalinux=("bash-completion" "yum-utils" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "bind-utils" "telnet" "lsof" "iperf3" "htop")
    local common_packages_ubuntu=("tree" "lrzsz" "iotop" "sysstat" "stress" "smartmontools" "screen" "iperf3")
    local common_packages_openEuler=("bash-completion" "vim" "wget" "tree" "lrzsz" "iotop" "sysstat" "smartmontools" "screen" "bind-utils" "telnet" "lsof" "iperf3" "htop")
    log info "安装常用软件包"
    case "${os_name}" in
    "centos")
        case "${major_version}" in
        "6")
            yum install -y "${common_packages_centos6[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        "7")
            yum install -y "${common_packages_centos7[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        "8")
            yum install -y "${common_packages_centos8[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "rocky")
        case "${major_version}" in
        "8" | "9")
            dnf install -y "${common_packages_rockylinux[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "almalinux")
        case "${major_version}" in
        "8" | "9")
            dnf install -y "${common_packages_almalinux[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "ubuntu")
        case ${major_version} in
        "20" | "22" | "24")
            sudo DEBIAN_FRONTEND=noninteractive apt-get install -y "${common_packages_ubuntu[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "openEuler")
        case "${major_version}" in
        "22" | "24")
            dnf install -y "${common_packages_openEuler[@]}" &>/dev/null || {
                log error "安装常用软件包失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    *)
        log error "不支持的操作系统！"
        return 1
        ;;
    esac
    log info "常用软件包安装完成"
}

# 服务配置
service_config() {
    # SELinux服务配置
    case "${os_name}" in
    "centos" | "rocky" | "almalinux" | "openEuler")
        if grep -q -E '^[[:blank:]]*SELINUX=disabled' /etc/selinux/config; then
            log warn "SELinux服务已关闭，无需再次操作！"
        else
            log info "配置SELinux服务"
            sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config || {
                log error "配置SELinux服务失败，请检查配置。"
                return 1
            }
            setenforce 0
            log warn "SELinux服务已临时关闭，需重启系统才能长久关闭。"
        fi
        ;;
    *) ;;
    esac

    # 防火墙服务配置
    log info "关闭防火墙服务"
    case "${os_name}" in
    "centos")
        case "${major_version}" in
        "6")
            # 停止防火墙服务
            service iptables stop >/dev/null || {
                log error "关闭防火墙服务失败，请检查配置。"
                return 1
            }
            # 禁用防火墙服务
            chkconfig iptables off || {
                log error "禁用防火墙服务失败，请检查配置。"
                return 1
            }
            ;;
        "7" | "8")
            systemctl disable firewalld.service --now &>/dev/null || {
                log error "关闭防火墙服务失败，请检查配置。"
                return 1
            }
            ;;
        esac
        ;;
    "rocky" | "almalinux" | "openEuler")
        systemctl disable firewalld.service --now &>/dev/null || {
            log error "关闭防火墙服务失败，请检查配置。"
            return 1
        }
        ;;
    *)
        sudo systemctl disable ufw.service --now &>/dev/null || {
            log error "关闭防火墙服务失败，请检查配置。"
            return 1
        }
        ;;
    esac
    log info "防火墙服务已关闭"

    # SSH服务配置
    log info "优化SSH服务连接"
    case "${os_name}" in
    "centos")
        case "${major_version}" in
        "6" | "7")
            sed -i \
                -e 's|GSSAPIAuthentication yes|GSSAPIAuthentication no|' \
                -e 's|#UseDNS yes|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        "8")
            sed -i \
                -e 's|GSSAPIAuthentication yes|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "rocky")
        case "${major_version}" in
        "8")
            sed -i \
                -e 's|GSSAPIAuthentication yes|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        "9")
            sed -i \
                -e 's|#GSSAPIAuthentication no|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "almalinux")
        case "${major_version}" in
        "8")
            sed -i \
                -e 's|#GSSAPIAuthentication yes|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        "9")
            sed -i \
                -e 's|#GSSAPIAuthentication no|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "ubuntu")
        case "${major_version}" in
        "20" | "22" | "24")
            sudo sed -i \
                -e 's|#GSSAPIAuthentication no|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    "openEuler")
        case "${major_version}" in
        "22" | "24")
            sed -i \
                -e 's|GSSAPIAuthentication yes|GSSAPIAuthentication no|' \
                -e 's|#UseDNS no|UseDNS no|' /etc/ssh/sshd_config || {
                log error "优化SSH服务配置失败，请检查配置。"
                return 1
            }
            ;;
        *)
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    *)
        log error "不支持的操作系统！"
        return 1
        ;;
    esac
    case "${os_name}" in
    "centos")
        case "${major_version}" in
        "6")
            service sshd restart >/dev/null || {
                log error "重启SSH服务失败，请检查配置。"
                return 1
            }
            ;;
        "7" | "8")
            systemctl restart sshd.service || {
                log error "重启SSH服务失败，请检查配置。"
                return 1
            }
            ;;
        esac
        ;;
    "rocky" | "almalinux" | "openEuler")
        systemctl restart sshd.service || {
            log error "重启SSH服务失败，请检查配置。"
            return 1
        }
        ;;
    *)
        log error "不支持的Linux系统！"
        return 1
        ;;
    esac
    log info "SSH服务优化完成"
}

# 系统更新
os_update() {
    log info "开始升级更新"

    # 如果是Ubuntu系统则直接更新
    if [ "${os_name}" = "ubuntu" ]; then
        log info "正在升级更新..."
        sudo apt-get upgrade -y &>/dev/null || {
            log error "Ubuntu系统更新失败，请检查配置。"
            return 1
        }
        # 删除下载的 .deb 文件
        log info "删除下载的 .deb 文件..."
        sudo apt-get clean -y || {
            log error "清理下载的 .deb 文件失败，请检查配置。"
            return 1
        }
        # 清理无用包
        log info "正在清理无用包..."
        sudo apt-get autoremove -y --purge >/dev/null || {
            log error "清理无用包失败，请检查配置。"
            return 1
        }
        log info "系统更新完成"
        return 0
    fi

    # 非Ubuntu系统进入交互选择流程 获取用户升级选项
    while true; do
        read -p "请选择升级类型 [0-全局更新含系统次版本 | 1-仅更新本地软件及Kernel | q-退出升级]：" upgrade_choice
        case "${upgrade_choice}" in
        0)
            # 用户选择0，不排除任何包，进行完整升级
            exclude_packages=""
            break
            ;;
        1)
            # 用户选择1，仅升级本地软件和Kernel，需要根据操作系统设置排除参数
            case "${os_name}" in
            "centos" | "openEuler")
                # 对于CentOS和openEuler，排除发行版的升级包
                exclude_packages="--exclude=${os_name}-release*"
                ;;
            "rocky" | "almalinux")
                # 对于Rocky和AlmaLinux，不仅排除发行版的升级包，还需添加nobest参数
                exclude_packages="--exclude=${os_name}-release* --nobest"
                ;;
            *)
                # 如果操作系统不受支持，记录错误并退出
                log error "当前操作系统不支持排除发行包"
                return 1
                ;;
            esac
            break
            ;;
        q)
            # 用户q，退出升级
            log warn "退出升级"
            return 0
            ;;
        *)
            # 如果用户输入非0或1，记录错误并重新提示
            log error "输入错误，请重新输入0或1或q"
            ;;
        esac
    done

    log info "正在升级更新..."

    # 根据操作系统名称和主版本号进行系统更新
    case "${os_name}" in
    "centos" | "rocky" | "almalinux" | "openEuler")
        # 根据操作系统主版本号选择合适的包管理工具和更新方式
        case "${major_version}" in
        "6" | "7")
            # 对于 CentOS 7 等旧版本操作系统，使用 yum 进行系统更新
            yum update -y ${exclude_packages} >/dev/null || {
                log error "更新系统失败，请检查配置。"
                return 1
            }
            ;;
        "8" | "9" | "22" | "24")
            # 对于 CentOS 8 及以上版本或其他新版本操作系统，使用 dnf 进行系统更新
            dnf update -y ${exclude_packages} &>/dev/null || {
                log error "更新系统失败，请检查配置。"
                return 1
            }
            ;;
        *)
            # 如果操作系统主版本号不匹配已知版本，输出错误信息并退出
            log error "不支持的操作系统主版本"
            return 1
            ;;
        esac
        ;;
    *)
        # 如果操作系统名称不匹配已知操作系统，输出错误信息并退出
        log error "不支持的操作系统！"
        return 1
        ;;
    esac
    log info "系统更新完成"
}

# 主函数 该函数负责调用一系列配置和更新函数，以实现系统的初始化和更新
main() {
    # 检测当前系统是否能够成功连接到网络
    check_network

    # 检查操作系统类型，确保后续操作的兼容性
    check_os

    # 更新软件包镜像源，以获取最新的软件包信息
    update_mirrors

    # 安装常用的软件包，为系统提供基本的功能支持
    install_common_packages

    # 配置系统服务，以满足特定的系统管理和安全需求
    service_config

    # 执行操作系统级别的更新，以应用最新的补丁和安全更新
    os_update

    # 记录警告日志，提醒用户系统操作已完成，需要重启系统以生效更改
    log warn "操作全部完成，请重启系统！"
}

# 执行主函数
main
